• mynote todo misc
  • mynote sync 同步
  • <!doctype html> head 添加
  • id 代替path
  • 上线前todo
  • 上线前todo 2
  • 2018-10 整理
  • 短信
  • 前后分离
  • mynote codetracker/ct error
  • 实习 todo
  • mynote todo tnds
  • markdown 转纯文本有问题
  • 微信公众号 掘金等一键发布 selenium
  • 提醒工具 todo list
  • mynote todo misc
    mynote tnds 

    mynote sync 同步

    E:\uninote\mynote_res\mynote\edam-sync.pdf
    lv1=mynote lv2= type=todo

    head 添加

    客户端
    lv1=mynote lv2= type=todo

    id 代替path

    comment.article_id 变成了真正的id
    中文问题
    前端不再需要path
    basename test;setlocale 在linux下无效
    phpstorm声明$maxlen默认值为null,但传入null却无法读取内容:
    file_get_contents($path, null, null, -1);
    file_get_contents($path, null, null, null);
    function file_get_contents ($filename, $flags = null, $context = null, $offset = null, $maxlen = null) {}
    $("#path") 不再需要
    checkout_content 不再需要
    path_for_aid 不再需要
    lv1= lv2= type=

    上线前todo

    if (YII_ENV_DEV) {
        // configuration adjustments for 'dev' environment
        $config['bootstrap'][] = 'debug';
        $config['modules']['debug'] = [
            'class' => 'yii\debug\Module',
            // uncomment the following to add your IP if you are not connecting from localhost.
            'allowedIPs' => ['127.0.0.1', '::1', '120.78.153.202'],
        ];
    actionLike 这个不能取消(uid不需要传,直接用就是了):
            if ($uid != $_SESSION['user_id']) {
                return ResponseTools::return_error(ResponseCode::USER_ID_ERROR);
            }
    已经初始化了,不必再判断:
    public function init()
    {
        CT("app/controllers/api/common/BaseController.init(){}");
        $this->req = \Yii::$app->request;
    request 包含get、post?
    没有参数为啥要post?
        public function actionCount()
        {
            if (!empty($_POST)) {
    @throws \yii\db\Exception
     * @throws \yii\db\StaleObjectException
     */
    public function picUpdate($userId, $base64, &$errno = 0)
    public function addPv($aid, $uid, $ip, $referer, &$errno = 0)
    public function getArtLikeNum($aid)
    逐渐脱离框架
    对比:
    private function _checkout_for_like_repeat($ids)
    public function checkoutForLikeRepeat($uid, $aid)
    ??
    use function PHPSTORM_META\type;
    use app\lib\ResponseTools;
            if (!$arr) {
                $errno = ResponseCode::NOT_HAVE_USER;
                // TODO: 记录日志,而非返回错误,前端无法(不)处理
            }
    //        return ResponseTools::return_error(ResponseCode::NOT_HAVE_USER, null, false);
            return ResponseTools::return_error(0, $arr, true);
    轮播图获取失败
    保存文件时发现working dir not clean
    部分可用如何处理?
    需要同时支持curl方式获取,session问题?fe server不维护session,仅做转发功能
    如何确保session_start至多只调用一次?
    每个请求都要初始化这些,完全没必要
    public function init()
    {
    	CT("app/controllers/common/BaseController.init(){}");
    	$this->req = \Yii::$app->request;
    	$this->api_url = \Yii::$app->api->api_url;
    	$this->curl_model = new Curl();
    	$this->com = new Com();
    lv1= lv2= type=

    上线前todo 2

    protected function internalExecute($rawSql)
    这是干啥?
    if (!$rs_arr['status']) {
        slog("[save sql] - \n{$rs_arr['data']}\n - SQL statement has no influence on rows.\n");
    }
    传路径要验证,不能超出用户目录范围。
    errno直接返回到数组中,status逻辑重复。如md.php
    md.php, init时就确定了:
    $_SESSION['web']['user_info']['username']
    actionRename 这里面的文件是否存在需要放在_git_op_lock中,因为可能需要切换版本,并且要在锁中进行。
    _db_save_md 新建、编辑分离,就不要insert ... ON DUPLICATE KEY UPDATE 这种了
    错误:
    url: api_url + '/markdown/version',
    var st = $(this).attr('disabled') || true;
    6e641acece98335aa43b3d2c0b5459c1f128cafd
    lv1= lv2= type=

    2018-10 整理

    为啥传入uid?
    \app\logic\ArticleLogic::info
    yii中,1068799191这个被自动识别为id:
    http://localhost:222/book/1068799191
    E:\uninote\mynote\basic\controllers\BookController.php
    public function actionIndex()
    {
        // 接收请求
        if ($this->req) {
            $username = $this->req->get('id',FALSE);// 用户唯一标示
        }
    actionArticle_info 通过article_info访问
    共享ajax controller?
    也封装为logic:
    // 获取 user_id
    if ($this->is_login_bool) {
        $uid = $_SESSION['web']['user_id'];
    } else {
        $uid = NULL;
    }
    public static function return_error($errno, $data = '', $status = false)
    {
        return ['errno' => $errno, 'data' => $data, 'status' => $status];
    }
    curl_error curl_errno
    http status code & response
    build query 不调用?
    file传递?
    超时时间
    CURLOPT_HEADER 决定是否返回header,但即使为false,也可以获取http code
    CURLOPT_RETURNTRANSFER 一般都为true,返回而非直接print
    http://php.net/manual/en/function.curl-setopt.php
    curl_setopt_array
    public static function proxy_logic($class, $method, $args)
    // 从model取数据,再根据status设置errno:
    public function getArticleContent($article_id)
    {
        if (!$article_id) {
            return ResponseTools::return_error(ResponseCode::NOT_HAVE_ARTICLE_UNIQUE);
        }
        $article_model = new Article();
        // 通过 username path 查询出所有文章内容
        $data = $article_model->show_content($article_id);
        $data['status'] ? $data['errno'] = '' : $data['errno'] = $article_model->errno;
        return $data;
    logic的status是内部的,还是外部的?
    php reflection
    curl error:端口错误 ip错误 超时
    errno:api返回的,用于api排查错误的
    X:\project\visual studio projects\findhelper\codeviewer\Test\GrammarParserTests_out\idcard.php
    CTInsert 前不再 CTRemove
    修改删除的逻辑:
    old:函数定义开始处,第一个非空的内容如果是CT,则一直查找到";",删除之
    new:函数定义开始处,一直找到";",生成字符串,去匹配removePattern_,如果成功,删除之
    if(isset(\Yii::$app->api->api_proxy_url)) { return \app\logic\CommonLogic::proxy_logic(__CLASS__, __METHOD__, func_get_args()); }
    注意移除\app\logic\CommonLogic::proxy_logic自身的proxy
    登录返回:
    $user_logic->getuserinfoto 返回,多了num,用户文章数(何时使用??):
    限制$_session的滥用
    移除,好像没用了:
    /* @describe 接口:更新用户session
     * @return 输出请求结果
     * */
    public function actionUpdate_user_session()
    {
        $user_id = $this->req->post('id', FALSE);
        $this->update_user_session($user_id);
        echo json_encode(['info'=>'更新用户session完毕。']);
    }
    update..session.. 整理,id是多余的
    remove:已登录,更新用户session 
    前后端同步登陆session
    removed:
        /*
        *   @describe  向后台发送同步登陆session 
        *   @return    NULL
        */    
        private function _synchrodata()
        {
            $msign = $this->com->AES($_SESSION["web"]["user_info"]);
            $param = array('id'=>$_SESSION["web"]["user_id"],'data'=>$msign);
            $url = "/user/synchrodata";
            $this->curl_model->http_post($this->api_url.$url,$param);
        }
        /**
        * @function 
        * @deprecated
        * @param $url String api地址
        * @param $param Array/String 请求的参数
        * 请求api指引方法
        */
        // public function _req_api($url,$param)
        // {
        //     // 请求信息
        //     if (is_array($param) || is_object($param)) {
        //         $param_en = http_build_query($param);
        //     } else {
        //         $param_en = $param;
        //     }    
            
        //     if ($this->curl_model->http_post($this->api_url.$url,$param)) {
        //         $json = $this->curl_model->tmp_info;
        //         $data = json_decode($json,TRUE);
                
        //         /*记录日志*/
        //         $param_str = urldecode($param_en);
        //         $api_info = "httpCode: {$this->curl_model->http_code} \n url: {$this->api_url}{$url} \n param: {$param_str} \n result: \n {$json} ";
        //         \SeasLog::info($api_info,array(),'api');
                
        //         /*定义返回数据*/
        //         $data['json'] = $json;
        //         // 客户端登录数据还在 - 向后台发送同步登陆session
        //         if (!empty($data['errno']) && $data['errno'] == -1100 && !empty($_SESSION["web"]["user_info"])) {
        //             $this->_synchrodata();
        //             return $this->_req_api($url,$param);
        //         }
        //         if (!empty($data['json'])) {
        //             return $data;
        //         }
        //         throw new \Exception("no json data", -2000);
        //     } else {
        //         throw new \Exception("curl error", -2001);
        //     }
        // }
    is_mobile_request 耗时?优化:根据session,判断是否是mobile。不必每次都计算。
    lv1=mynote lv2= type=todo
    session中存储pv信息,避免数据库操作。
    public function Addpv($arr)
    {
        $rs = \Yii::$app->db->createCommand()->Insert('artpv',$arr)->execute();
    这个会导致复杂的运算??耗时??
    SELECT
        kcu.constraint_name,
        kcu.column_name,
        kcu.referenced_table_name,
        kcu.referenced_column_name
    FROM information_schema.referential_constraints AS rc
    JOIN information_schema.key_column_usage AS kcu ON
        (
            kcu.constraint_catalog = rc.constraint_catalog OR
            (kcu.constraint_catalog IS NULL AND rc.constraint_catalog IS NULL)
        ) AND
        kcu.constraint_schema = rc.constraint_schema AND
        kcu.constraint_name = rc.constraint_name
    WHERE rc.constraint_schema = database() AND kcu.table_schema = database()
    AND rc.table_name = 'artpv' AND kcu.table_name = 'artpv'
    SessionTools controller不要直接使用
    get_message_bool todo
    'user_info' => $this->user_info,
    <?= $user_info["username"]; ?>
    <?= $user_info['username']; ?>
    lv1=mynote lv2= type=todo
    评论,username不要记死了
    lv1=mynote lv2= type=todo
    是否登录不应该以有无session为标记
    user_id 未登录下,不再设置为ip
    'user_info' => $this->user_info,
    $_SESSION['web']['user_info']['username'];   -> $this->user_info['username']
    lv1=mynote lv2= type=todo
    actionLunbotuadd 还有用没?
    lv1=mynote lv2= type=todo
    js不用uid,如何判断是否登录?
    lv1=mynote lv2= type=todo
    前后分离的头像update有问题
    lv1=mynote lv2= type=todo
    user、book controller取消了模板配置
    getArticleNum 需要status=1判断
    编辑时不应该调用 _db_for_file
    验证码session
    $uid = \app\lib\SessionTools::getUid();
    $user_id = SessionTools::getUid();
    $ctx = $this->context;
    $_SESSION['web']['user_id']
    ->
    $ctx->user_id
    SessionTools::getUid()
    $_SESSION['web']['user_info']['username']
    ->
    $ctx->user_info["username"]
    $session = SessionTools::getSession();
    $web = &SessionTools::get('web');
    unset($web['check_code_time']);
    这样可以:
    $aaa = null;
    unset($aaa["aaab"]);
    echo "ok";
    lv1=mynote lv2= type=todo
    信息放session,如果每次不从数据库中取,可能不是最新的。
    getuserinfo 如何调用??
    lv1= lv2= type=

    短信

    AccessKey详情
    old:AccessKeyID:LTAImnfwWptNEeqz AccessKeySecret:u2ClVsV29RQl4GYFOQvduU0ujV6riY
    AccessKeyID:LTAI5tEN6KHHUKkAbeNdrwve AccessKeySecret:yGC14sSVfUR5joGBIGQ2EnKTACobh7
    key 设置:https://ram.console.aliyun.com/manage/ak 

    前后分离

    前端的controller,不应该返回json,api访问直接调用api的controller: -- 但这样会有跨域问题。可以考虑怎样简化代码
    public function actionTelregister()
    {
        $tel = $this->req->post('tel', FALSE);
        $code = $this->req->post('code', FALSE);
        $password = $this->req->post('password', FALSE);
        
        $user_logic = new UserLogic();
        $result = $user_logic->user_telregister($tel,$code,$password);
        
        return $this->handle_result($result);
    }

    mynote codetracker/ct error

    php codetracker ct 
    views/user/login.php
    function check() {
    E:\uninote\mynote\basic\views
    common.php
    E:\uninote\mynote\basic\web\tests\log_storage.php
    E:\uninote\mynote\basic\models\page.php
    lv1= lv2= type=

    实习 todo

    rtf文档整理;php等文档整理
    pdf-》html 整理

    mynote todo tnds

    lv1=mynote lv2= type=todo
    // 获取当前系统时间,返回float格式,单位:秒
    function get_time() {
    	date_default_timezone_set('Asia/Shanghai');
    	list($usec, $sec) = explode(" ", microtime());
    	return ((float)$usec + (float)$sec);
    }
    lv1=mynote lv2= type=todo
    自动创建git仓库、管理ssh key
    SHA-1: 3ba286f4ff9561807b8ec143465470f00de5be57
    * 【更新】- html缓存清理
    这种容易解析不到json
    [master 0743903] update
     Date: Sat Aug 11 15:57:14 2018 +0800
     1 file changed, 1 insertion(+), 1 deletion(-)
    Deleted branch update_1941333651 (was 0743903).
    {"status":true}
    lv1=mynote lv2= type=todo
    异常处理
    public function runWithParams($params)
    这里如果已经有输出,header 500 还有作用?
    public function render_error($code)
    {
        CT("app/controllers/api/common/BaseController.render_error(code){}");
        global $request_num;
        $response = /Yii::$app->getResponse();
        $response->format = $response::FORMAT_RAW;
        $response->getHeaders()->set('Status', 500);
        return "error occurs : {$request_num} /n code : {$code}";
    }
    一般的错误,不要报404
    lv1=mynote lv2= type=todo
    环境变量控制config
    check session_start(); 
    这种不应该作为member:
    public $curl_model = NULL;// curl 模块
    lv1=mynote lv2= type=todo
    2>&1 可以放到 $this->_shell_ex($cmds);里面
    免得每个都去写
    lv1=mynote lv2= type=todo
    actionResetpwd_tel actionResetpwd_email 提起公共代码
    lv1= lv2= type=todo

    markdown 转纯文本有问题

    public function get_text($html,$ext='md')
    {
        if ($ext == 'md') {
            $parser = new \HyperDown\Parser;
            $html = $parser->makeHtml($html);
            $html = "<html><body>" . $html . "</body></html>";
            $doc = \phpQuery::newDocument($html);
            return $doc->text();
        } else {
            $html = $this->CloseTags($html);
            $doc = \phpQuery::newDocument($html);
            $doc["#outline"]->empty();
            $doc["style"]->empty();
            $doc["script"]->empty();
            return $doc["body"]->text();
        }
    }
    lv1= lv2= type=

    微信公众号 掘金等一键发布 selenium

    selenium等待用户完成某个动作。
    获取数据post
    js脚本?
    E:\projects\tweets
    E:\projects\tweets\README.md
    pip3 install selenium
    pip3 install yaml -> PyYAML
    pip3 install requests
    ERROR:root:'gbk' codec can't decode byte 0x80 in position 395: illegal multibyte sequence
    Traceback (most recent call last):
      File "E:\projects\tweets\workspace\baseMethod.py", line 122, in yaml_read
        return yaml.load(f, yaml.FullLoader)["browser"]
    pyhon-----安装yaml踩过的坑以及正解
    https://www.codetd.com/article/1883431
    https://stackoverflow.com/questions/14261614/how-do-i-install-the-yaml-package-for-python
    https://stackoverflow.com/questions/14261614/how-do-i-install-the-yaml-package-for-python/23613658
    There are three YAML capable packages. Syck (pip install syck) which implements the YAML 1.0 specification from 2002; PyYAML (pip install pyyaml) which follows the YAML 1.1 specification from 2004; and ruamel.yaml which follows the latest (YAML 1.2, from 2009) specification.
    https://github.com/yaml/pyyaml
    https://w3c.github.io/webdriver
    "C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
    自动化测试-20.selenium常用JS代码执行
    https://www.cnblogs.com/cmnz/p/9099473.html
    单独的管理后台,用mynote的账号密码登录
    同步更新:uninote编辑之后,自动同步更新到其他平台。
      能够区分出是编辑还是是新增
      管理同步到哪些平台
    评论收集、统一的评论管理
    统计阅读量、评论、点赞量,每日数据统计
    消息统一管理
    uninote 发文章之后,默认同步到其他平台。
    aidmynotejuejinsegmentdefaultviewcommentlikepublish?viewcommentlikepublish?viewcommentlikepublish?1132yesnoyes
    lv1= lv2= type=

    提醒工具 todo list

    告诉xx做一件事,1h 检查,我记录在电脑上
    1h后,电脑上提醒我,如果我没有关掉,消息推送;还是不行,短信
    (换一句话说:桌面 创建时;也可以自定义延迟时间,过了此设定,则手机震动提醒。再超过一定的阈值发送短信)
    手机上可以修改。
    再次提醒 10 20 分钟 可以自定义;
    方便创建
    服务器同步,多端可以同时修改。
    支持桌面(桌面版支持热键)、手机端(小程序+hbuilder)
    -end